package com.wjyf.reducing_bento;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.LikeTable;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.keywords.MySqlKeyWordsHandler;

import java.util.Collections;

public class CodeAutoGenerator {
    /**
     * 数据源配置
     */
    private static final DataSourceConfig.Builder DATA_SOURCE_CONFIG = new DataSourceConfig
            .Builder("jdbc:mysql://119.91.208.79:3310/reducing_bento?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai",
            "root", "123456")
            //数据库查询
            .dbQuery(new MySqlQuery())
            //数据库schema(部分数据库适用)
            .schema("mybatis-plus")
            //数据库类型转换器
            .typeConvert(new MySqlTypeConvert())
            //数据库关键字处理器
            .keyWordsHandler(new MySqlKeyWordsHandler());


    /**
     * 执行 run
     */
    public static void main(String[] args) {
        /** 1、配置数据源 */
        FastAutoGenerator.create(DATA_SOURCE_CONFIG)
                /** 2、全局配置 */
                .globalConfig(builder -> builder
                        .author("wjyf") // 设置作者名
                        .outputDir(System.getProperty("user.dir") + "/src/main/java")   //设置输出路径：项目的 java 目录下
                        .commentDate("yyyy-MM-dd hh:mm:ss")   //注释日期
                        .dateType(DateType.ONLY_DATE)   //定义生成的实体类中日期的类型 TIME_PACK=LocalDateTime;ONLY_DATE=Date;
                        .fileOverride()   //覆盖之前的文件
                        .enableSwagger()   //开启 swagger 模式
                        .disableOpenDir()   //禁止打开输出目录，默认打开
                        .build() //加入构建队列
                )
                /** 3、包配置 */
                .packageConfig(builder -> {
                    builder.parent("com.wjyf.reducing_bento") // 设置父包名
                            .entity("entity")   //pojo 实体类包名
                            .service("service") //Service 包名
                            .serviceImpl("service.impl") // ***ServiceImpl 包名
                            .mapper("mapper")   //Mapper 包名
                            .xml("mapper.xml")  //Mapper XML 包名
                            .controller("controller") //Controller 包名
                            .other("utils") //自定义文件包名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir")+"/src/main/resources/mapper"));    //配置 mapper.xml 路径信息：项目的 resources 目录下
                })
                /** 4、策略配置 */
                .strategyConfig(builder -> builder
                        .enableCapitalMode() // 开启大写命名，默认值:false
                        .enableSkipView() // 开启跳过视图，默认值:false
                        .disableSqlFilter() // 禁用 sql 过滤，默认值:true，语法不能支持使用 sql 过滤表的话，可以考虑关闭此开关
                        .likeTable(new LikeTable("USER")) //模糊表匹配(sql 过滤)	likeTable 与 notLikeTable 只能配置一项
                        .addInclude("tb_commodity","tb_coupon","tb_coupon_logs","tb_coupon_receive","tb_indent","tb_user") // 设置需要生成的数据表名
                        .addTablePrefix("tb_") // 设置过滤表前缀
                        //.addFieldSuffix("_") // 增加过滤表后缀
                        //.addFieldPrefix("ul_") // 增加过滤字段前缀  本人不建议使用，去掉后缀，会导致驼峰命名实体类的变量名不带前缀，去掉后,错误：Username，正确:ulUsername
                        //.addFieldSuffix("_") // 增加过滤字段后缀
                        /**4.1、mapper策略配置 */
                        .mapperBuilder()
                        .superClass(BaseMapper.class)   // 设置父类
                        .formatMapperFileName("%sMapper")   // 格式化 mapper 文件名称
                        .enableMapperAnnotation() // 开启 @Mapper 注解
                        .formatXmlFileName("%sMapper") // 格式化 Xml 文件名称
                        .enableBaseResultMap() // 启用 BaseResultMap 生成，默认值:false
                        .enableBaseColumnList() // 启用 BaseColumnList，默认值:false
                        /** 4.2、service 策略配置 */
                        .serviceBuilder()
                        .formatServiceFileName("%sService") //格式化 service 接口文件名称，%s进行匹配表名，如 UserService
                        .formatServiceImplFileName("%sServiceImpl") //格式化 service 实现类文件名称，%s进行匹配表名，如 UserServiceImpl
                        /** 4.3、entity策略配置 */
                        .entityBuilder() // 实体策略配置
                        .enableLombok() // 开启 Lombok
                        .enableChainModel() // 开启链式模型，默认值:false
                        .enableRemoveIsPrefix() // 开启 Boolean 类型字段移除 is 前缀，默认值:false
                        .enableTableFieldAnnotation() // 开启生成实体时生成字段注解，默认值:false
                        .enableActiveRecord() // 开启 ActiveRecord 模型，默认值:false
//                        .disableSerialVersionUID() //不实现 Serializable 接口，不生产 SerialVersionUID
                        //.logicDeleteColumnName("deleted")   //逻辑删除字段名
                        .naming(NamingStrategy.underline_to_camel)  //数据库表映射到实体的命名策略：下划线转驼峰命
                        .columnNaming(NamingStrategy.underline_to_camel)    //数据库表字段映射到实体的命名策略：下划线转驼峰命
                        .idType(IdType.AUTO) // 全局主键类型
                        .formatFileName("%sBean") // 格式化文件名称，生成实体的后缀，建议这样使用，生成后：UserBean
                        .addTableFills(
                                new Column("create_time", FieldFill.INSERT),
                                new Column("modify_time", FieldFill.INSERT_UPDATE)
                        )   //添加表字段填充，"create_time"字段自动填充为插入时间，"modify_time"字段自动填充为插入修改时间
                        .enableTableFieldAnnotation()       // 开启生成实体时生成字段注解
                        /** 4.4、controller策略配置 */
                        .controllerBuilder() // controller 策略配置
                        .enableHyphenStyle() // 开启驼峰转连字符，默认值:false
                        .formatFileName("%sController") // 格式化 Controller 类文件名称，%s进行匹配表名，如 UserController
                        .enableRestStyle()  // 开启生成 @RestController 控制器
                        .build() // 加入构建队列
                )
                /** 5、模板配置 */
                .templateConfig(builder -> builder
                        .disable()
                        .entity("/templates/entity.java")
                        .service("/templates/service.java")
                        .serviceImpl("/templates/serviceImpl.java")
                        .mapper("/templates/mapper.java")
                        .mapperXml("/templates/mapper.xml")
                        .controller("/templates/controller.java")
                        .build()
                )
                /** 6、模板引擎 */
                //Velocity
                //.templateEngine(new VelocityTemplateEngine())
                //Beetl
                //.templateEngine(new BeetlTemplateEngine())
                //Freemarker
                .templateEngine(new FreemarkerTemplateEngine())
                /** 7、执行 */
                .execute();
    }
}
